/*
 * @Author: 13177709051 3506463075@qq.com
 * @Date: 2024-11-22 23:52:54
 * @LastEditors: 13177709051 3506463075@qq.com
 * @LastEditTime: 2024-11-23 11:38:38
 * @FilePath: /linux35/InetAddr.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#pragma once

#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

class InetAddr
{
private:
    void ToHost(const struct sockaddr_in &addr)
    {
        _port = ntohs(addr.sin_port);
        // _ip = inet_ntoa(addr.sin_addr);
        char ip_buf[32];
        // inet_p to n
        // p: process
        // n: net
        // inet_pton(int af, const char *src, void *dst);
        // inet_pton(AF_INET, ip.c_str(), &addr.sin_addr.s_addr);
        ::inet_ntop(AF_INET, &addr.sin_addr, ip_buf, sizeof(ip_buf));
        _ip = ip_buf;
    }

public:
    InetAddr(const struct sockaddr_in &addr):_addr(addr)
    {
        ToHost(addr);
    }
    InetAddr()
    {}
    bool operator == (const InetAddr &addr)
    {
        return (this->_ip == addr._ip && this->_port == addr._port);
    }
    std::string Ip()
    {
        return _ip;
    }
    uint16_t Port()
    {
        return _port;
    }
    struct sockaddr_in Addr()
    {
        return _addr;
    }
    std::string AddrStr()
    {
        return _ip + ":" + std::to_string(_port);
    }
    ~InetAddr()
    {
    }

private:
    std::string _ip;
    uint16_t _port;
    struct sockaddr_in _addr;
};


// 这个类封装了 sockaddr_in 结构体，用于简化对 IP 地址和端口的处理。其核心功能是将网络字节序的 sockaddr_in 地址转换为易于操作的主机字节序的 IP 地址字符串和端口号，并提供相关的成员函数来获取这些信息。
// 私有成员变量
// _ip：存储 IP 地址的字符串（如 "192.168.0.1"）。
// _port：存储端口号。
// _addr：存储一个 sockaddr_in 结构体，用于保存 IP 地址和端口。
// 私有成员函数 ToHost
// ToHost 函数的作用是将一个 sockaddr_in 地址结构转换为 InetAddr 类的成员 _ip 和 _port。
// ntohs(addr.sin_port)：将网络字节顺序的端口号（从 sockaddr_in 中获取）转换为主机字节顺序。网络字节顺序是大端模式，而主机字节顺序通常取决于平台。
// inet_ntop(AF_INET, &addr.sin_addr, ip_buf, sizeof(ip_buf))：将 sockaddr_in 中的 IP 地址（以二进制形式存储）转换为点分十进制字符串表示（如 "192.168.0.1"）。
// 这里 inet_ntop 和 ntohs 用于处理网络字节序和主机字节序的转换，确保 IP 地址和端口在不同环境下的正确性。
// 构造函数 InetAddr(const struct sockaddr_in &addr)
// 该构造函数接受一个 sockaddr_in 类型的参数 addr，并调用 ToHost 方法将其转换为 InetAddr 类内部的 _ip 和 _port。
// _addr(addr)：将 sockaddr_in 结构体存储在 _addr 中。
// 默认构造函数 InetAddr()
// 默认构造函数没有做任何事情。它用于创建一个空的 InetAddr 对象
// 运算符重载 ==
// 重载了 == 运算符，用于比较两个 InetAddr 对象是否相等。它通过比较 ip 和 port 字段来判断是否相同。
// 成员函数 Ip
// 返回当前 InetAddr 对象的 IP 地址。
// 成员函数 Port
// 返回当前 InetAddr 对象的端口号。
// 成员函数 Addr
// 返回存储的 sockaddr_in 结构体。sockaddr_in 包含了完整的 IP 地址和端口信息。
// 成员函数 AddrStr
// 返回一个格式化的字符串，表示 IP 地址和端口，格式为 "ip:port"（例如 "192.168.0.1:8080"）。



